#include "mainwindow.h"
#include "ui_mainwindow.h"

#include "QSerialPort"      //串口
#include "QSerialPortInfo"  //串口信息
#include "QMessageBox"      //弹窗提示
#include "QDebug"           //调试信息

//作者B站：漫天飞羽zz
//日期：2024/11/23

//定义一个串口指针
QSerialPort *COM = new QSerialPort();//定义串口指针，实例化串口

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    foreach( const QSerialPortInfo &info,QSerialPortInfo::availablePorts() )
    {
        ui->comboBox_available_COM->addItem(info.portName());
    }

    connect(COM,SIGNAL(readyRead()),this,SLOT(RX_FUN()));//信号槽连接
}

MainWindow::~MainWindow()
{
    delete ui;
}


//按键“刷新串口”点击函数
void MainWindow::on_key_Refresh_COM_clicked()
{
    ui->comboBox_available_COM->clear();//先清除项目
    foreach( const QSerialPortInfo &info,QSerialPortInfo::availablePorts() )
    {
        ui->comboBox_available_COM->addItem(info.portName());
    }
}

//按键“发送”点击函数
void MainWindow::on_key_COM_Tx_clicked()
{
    COM->write(ui->textEdit->toPlainText().toLatin1());//串口写数据（发送数据）
}

//按键“清除发送”点击函数
void MainWindow::on_key_COM_Tx_Clean_clicked()
{
    ui->textEdit->clear();//清空发送区
}

//按键“清除接收”点击函数
void MainWindow::on_key_COM_Rx_Clean_clicked()
{
    ui->textBrowser->clear();//清空接收区
}

//按键“打开串口”点击函数
void MainWindow::on_key_onoff_COM_clicked()
{
    //点击了“开灯”，就会进这里来
    //ui->LED1->setStyleSheet("background-color:red");//LED变红色
    //ui->LED1->setStyleSheet("background-color:green");//LED变绿色

    //串口初始化参数
    QSerialPort::BaudRate baudRate; //波特率
    QSerialPort::StopBits stopBits; //停止位
    QSerialPort::DataBits dataBits; //数据位
    QSerialPort::Parity   checkBits;//奇偶校验位

    //停止位 1位
    stopBits = QSerialPort::OneStop;

    //数据位 8位
    dataBits = QSerialPort::Data8;

    //奇偶校验位 无
    checkBits = QSerialPort::NoParity;

    //波特率
    if(ui->comboBox_botelv->currentText() == "9600")
    {
        baudRate = QSerialPort::Baud9600;
    }
    else if(ui->comboBox_botelv->currentText() == "115200")
    {
        baudRate = QSerialPort::Baud115200;
    }

    //初始化串口属性
    COM->setPortName(ui->comboBox_available_COM->currentText()); //端口名字
    COM->setBaudRate(baudRate); //波特率
    COM->setStopBits(stopBits); //停止位
    COM->setDataBits(dataBits); //数据位
    COM->setParity(checkBits);  //奇偶校验位

    //串口操作 打开/关闭
    if(ui->key_onoff_COM->text() == "打开串口" )
    {
         if(COM->open(QIODevice::ReadWrite) == true)//判断串口打开成功
         {
            ui->key_onoff_COM->setText("关闭串口");//按键文字变成 关闭串口
            ui->LED1->setStyleSheet("background-color:red");//LED变红色
         }
         else//串口打开不成功
         {
             QMessageBox::critical(this,"错误提示","打开串口失败！或其他错误。\r\n请选择正确的串口或该串口被占用");
         }
    }
    else if(ui->key_onoff_COM->text() == "关闭串口" )
    {
        COM->close();//关闭串口
        ui->key_onoff_COM->setText("打开串口");//按键文字变成 打开串口
        ui->LED1->setStyleSheet("background-color:black");//LED变黑色
    }
}

//串口接收
void MainWindow::RX_FUN()
{
    QByteArray buf;//接收缓冲区
    buf = COM->readAll(); //接收数据（读）存到缓冲区buf

    QString str;//定义一个字符变量

    if( !buf.isEmpty() ) //如果缓冲区不为空（接收到数据）
    {
        str = tr(buf);//将字节数组类型的数据转换成字符类型
        ui->textBrowser->insertPlainText(str);//在接收框里显示
        ui->textBrowser->moveCursor(QTextCursor::End);//光标移到最后一行

        //接收的数据解析到数码管里面显示
        QString temp;//定义一个字符变量 温度或湿度
        QString shuju;//定义一个字符变量 温度或湿度

        temp = str.left(2); //从一串字符串中最左边取字符

        if(temp=="wd")//如果接收到温度
        {
            shuju = str.mid(2);//从一串字符串中第几个数据开始取字符到末尾
            int wendu_x = shuju.toInt();//字符型转整形

            ui->lcd_wendu->display(wendu_x);//显示到数码管
        }

        else if(temp=="sd")//如果接收到湿度
        {
            shuju = str.mid(2);//从一串字符串中第几个数据开始取字符到末尾
            int shidu_x = shuju.toInt();//字符型转整形

            ui->lcd_shidu->display(shidu_x);//显示到数码管
        }
    }

}

